package com.example.springboot.context;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.annotation.Configuration;

/**
 * Aware
 * <p> 回调接口 → Spring 容器主动调用你的 Bean 方法,让 Bean 能获取 Spring 容器的一些内部信息或功能，而不用自己去查找 。
 *   换句话说，Bean 实现某个 Aware 接口后，Spring 会自动调用相应方法，把容器相关的对象传给你。
 * <p> 例如：获取容器对象（ApplicationContext） 、获取 Bean 的名称（BeanName）、获取 BeanFactory 等。
 *
 * <p> 发生在 Bean 的实例化之后，注入属性之前，也就是Setter之前。
 *
 * <p> 执行顺序
 *  <ol>
 *      initializeBean中，直接检查 Bean 是否实现这几个标签。
 *      <li>BeanNameAware (Bean 可以获取自己的名字（beanName），用于日志、注册等目的)</li>
 *      <li>BeanClassLoaderAware (Bean 获取类加载器，用于动态加载类或资源)</li>
 *      <li>BeanFactoryAware (获取 BeanFactory，能直接访问容器。常用于手动获取其他 Bean 或做程序化操作)</li>
 *
 *     后四种，在BeanFactoryAware执行后，由 ApplicationContextAwareProcessor 统一调用；
 *      <li>EnvironmentAware</li>
 *      <li>ResourceLoaderAware</li>
 *      <li>ApplicationContextAware</li>
 *      <li>MessageSourceAware</li>
 *  </ol>
 * <p>
 * @author Zhang.Z
 * @version 2025-09-21
 * @see Test4SmartInstantiationAwareBeanPostProcessor
 * @see BeanFactory
 * @see Test7ApplicationContextAwareProcessor
 */
@Configuration
public class Test6MyAware implements BeanFactoryAware, BeanNameAware {

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

        System.out.println("test6 bean factory aware ");
    }

    @Override
    public void setBeanName(String beanName) {
        System.out.println("test6 bean name aware ：" + beanName);
    }
}
